package com.hdl.api;

import org.apache.zookeeper.*;

import java.util.List;
import java.util.concurrent.CountDownLatch;

/**
 * 类名 CreateSession
 * 描述 获取节点内容
 *
 * @author hedonglin
 * @version 1.0
 * @date 2020/6/14 12:27
 */
public class GetNode implements Watcher {
    private static ZooKeeper zooKeeper;

    /**
     * 建立会话并获取节点
     *
     * @param args
     */
    public static void main(String[] args) throws Exception {
        /**
         * 客户端可以通过创建一个zk实例来连接zk服务器
         * new Zookeeper(connectString, sessionTimeOut, Watcher)
         * connectString连接地址， IP：端口
         * sessionTimeOut： 会话超时时间，单位毫秒
         * Watcher：监听器（当特定事件触发监听时，zk会通过watcher通知客户端）
         */
        zooKeeper = new ZooKeeper("192.168.227.131:2181", 3000, new GetNode());
        System.out.println(zooKeeper.getState());

        Thread.sleep(Integer.MAX_VALUE);
    }

    /**
     * 回调方法，处理来自服务器端的Watcher通知
     *
     * @param event
     */
    public void process(WatchedEvent event) {
        // SyncConnected
        if (event.getState() == Event.KeeperState.SyncConnected) {
            System.out.println("process方法被执行了....");
            try {
                getNodeData();
                getChildren();
            } catch (KeeperException e) {
                e.printStackTrace();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }



        // 子节点列表发生改变时，服务端会发生NodeChildrenChanged事件通知， 要重新获取子节点列表，同时注意: 通知是一次性的，需要反复注册监听
        if (event.getType() == Event.EventType.NodeChildrenChanged){
            try {
                getChildren();
            } catch (KeeperException e) {
                e.printStackTrace();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }

    }

    /**
     * 获取某个节点
     * path : 获取数据的路径
     * watch : 是否开启监听
     * stat : 节点状态信息
     * null: 表示获取最新版本的数据
     * zk.getData(path, watch, stat);
     */
    private void getNodeData() throws KeeperException, InterruptedException {
        byte[] data = zooKeeper.getData("/hdl-persistent", false, null);
        System.out.println(new String(data));
    }


    /**
     * 获取某个节点的子节点列表
     * path:路径
     * watch:是否要启动监听，当⼦节点列表发⽣变化，会触发监听
     * zooKeeper.getChildren(path, watch);
     */
    public static void getChildren() throws KeeperException, InterruptedException {
        List<String> children = zooKeeper.getChildren("/hdl-persistent", true);
        System.out.println(children);
    }

}
